import os
from openpyxl import load_workbook, Workbook

def combine_sheets_with_format(input_folder, output_file):
    # 创建一个新的工作簿用于存储所有合并后的工作表
    master_wb = Workbook()
    master_wb.remove(master_wb.active)  # 删除默认创建的第一个空白工作表

    # 遍历指定目录下的所有 .xlsx 文件
    for filename in os.listdir(input_folder):
        if filename.endswith(".xlsx"):
            file_path = os.path.join(input_folder, filename)
            
            try:
                # 加载原始工作簿
                wb = load_workbook(filename=file_path, data_only=False)  # 设置 data_only=False 以保留公式
                
                for sheet_name in wb.sheetnames:
                    ws = wb[sheet_name]
                    
                    # 在主工作簿中创建新的工作表
                    new_sheet_name = f"{os.path.splitext(filename)[0]}_{sheet_name}"
                    master_ws = master_wb.create_sheet(title=new_sheet_name)

                    # 复制单元格值和格式
                    for row in ws.iter_rows(values_only=False):
                        new_row = []
                        for cell in row:
                            new_cell = master_ws.cell(row=cell.row, column=cell.col_idx, value=cell.value)
                            if cell.has_style:
                                new_cell.font = cell.font
                                new_cell.border = cell.border
                                new_cell.fill = cell.fill
                                new_cell.number_format = cell.number_format
                                new_cell.protection = cell.protection
                                new_cell.alignment = cell.alignment

                    print(f"已处理文件: {filename} 中的工作表 {sheet_name}")
                
                wb.close()
                    
            except Exception as e:
                print(f"处理文件 {filename} 时出错: {e}")

    # 保存合并后的工作簿
    master_wb.save(output_file)
    print(f"所有工作表已成功合并到 {output_file}")

if __name__ == "__main__":
    input_folder = "/home/zgy/桌面/test/src/"  # 替换为你的实际文件夹路
    output_file = os.path.join(input_folder, "CombinedWorkbook.xlsx")  # 输出为 .xlsx 文件
    
    combine_sheets_with_format(input_folder, output_file)
